5 import java
.awt
.event
.KeyEvent
;
6 import java
.awt
.event
.KeyListener
;
7 import java
.awt
.event
.MouseEvent
;
8 import java
.awt
.event
.MouseListener
;
9 import java
.awt
.event
.MouseMotionListener
;
11 import models
.GraphModel
;
12 import models
.GraphVertex
;
14 import controllers
.actions
.AddEdge
;
15 import controllers
.actions
.Move
;
16 import controllers
.actions
.Rename
;
18 public class SelectionController
implements MouseListener
,MouseMotionListener
,KeyListener
{
19 private GraphPanel object
= null;
20 private GraphFrame frame
= null;
21 private GraphVertex selectedObject
= null;
22 private GraphModel model
= null;
24 private String typedStr
;
25 private String originalName
;
26 private boolean isChangingName
;
27 private int OriginalNameLength
;
29 private boolean isAddingEdge
;
30 private GraphVertex edgeObject1
;
33 private int clickX
= 0;
34 private int clickY
= 0;
35 private int mouseClickX
=0;
36 private int mouseClickY
=0;
38 private int mouseX
= 0;
39 private int mouseY
= 0;
41 public int getMouseX(){
44 public int getMouseY(){
49 public SelectionController(GraphFrame frame
, GraphModel model
){
50 isChangingName
= false;
53 frame
.setSelectionController(this);
54 frame
.addKeyListener(this);
56 setObject(frame
.getPanel());
60 public void doAddEdge()
66 edgeObject1
= this.getSelectedVertex();
69 public boolean isAddingEdge(){
73 private void finishAddingEdge(){
74 frame
.addAction(new AddEdge(edgeObject1
,this.getSelectedVertex(),this));
78 public GraphModel
getModel() {
81 public void setSelected(GraphVertex o
)
83 frame
.selectedObject(o
!= null);
87 if(selectedObject
!= null)
88 selectedObject
.setSelected(false);
91 if(selectedObject
!= null){
97 isAddingEdge
= false; // Didn't click object, cancel action
100 public GraphVertex
getSelectedVertex()
102 return selectedObject
;
105 public void removeSelected()
107 this.setSelected(null);
111 public void setObject(GraphPanel panel
){
113 object
.removeMouseListener(this);
114 object
.removeMouseMotionListener(this);
115 object
.removeKeyListener(this);
118 object
.addMouseListener(this);
119 object
.addMouseMotionListener(this);
120 object
.addKeyListener(this);
123 public void setModel(GraphModel model
){
129 // Called when the typing stops, Either Return has been pressed or a
130 // other object has been selected.
131 private void doChangeName(){
132 selectedObject
.setName(originalName
);
133 this.frame
.addAction(new Rename(typedStr
,this));
134 this.isChangingName
= false;
137 public GraphPanel
getPanel()
142 private void doCancelNameChange(){
143 selectedObject
.setName(this.originalName
);
144 selectedObject
.setWidth(this.OriginalNameLength
);
145 isChangingName
= false;
149 private void handleDoubleClick()
151 if(selectedObject
!= null){
153 isChangingName
= true;
154 originalName
= selectedObject
.getName();
155 OriginalNameLength
= selectedObject
.getWidth();
159 public void mouseClicked(MouseEvent arg0
) {
160 if(arg0
.getButton() == MouseEvent
.BUTTON1
){
161 if(arg0
.getClickCount() == 2){
164 this.setSelected(model
.getGraphByCoordinate(arg0
.getX(), arg0
.getY()));
169 public void mouseEntered(MouseEvent arg0
) {
172 public void mouseExited(MouseEvent arg0
) {
175 public void mousePressed(MouseEvent arg0
) {
176 this.setSelected(model
.getGraphByCoordinate(arg0
.getX(), arg0
.getY()));
178 clickX
= arg0
.getX();
179 clickY
= arg0
.getY();
181 mouseClickX
= arg0
.getX();
182 mouseClickY
= arg0
.getY();
185 public void mouseReleased(MouseEvent arg0
) {
186 if(selectedObject
!= null){
187 if(arg0
.getX() != mouseClickX
|| arg0
.getY() != mouseClickY
){
188 int newX
= this.getSelectedVertex().getX();
189 int newY
= this.getSelectedVertex().getY();
190 int orgX
= newX
- ( arg0
.getX() - mouseClickX
);
191 int orgY
= newY
- ( arg0
.getY() - mouseClickY
);
192 frame
.addAction(new Move(orgX
,orgY
,newX
,newY
,this.getSelectedVertex()));
198 public void mouseDragged(MouseEvent arg0
) {
199 if(selectedObject
!= null){
200 selectedObject
.setX(selectedObject
.getX() + (arg0
.getX() - clickX
));
201 selectedObject
.setY(selectedObject
.getY() + (arg0
.getY() - clickY
));
202 clickX
= arg0
.getX();
203 clickY
= arg0
.getY();
208 public void mouseMoved(MouseEvent arg0
) {
209 this.mouseX
= arg0
.getX();
210 this.mouseY
= arg0
.getY();
211 if(this.isAddingEdge
){
212 this.object
.repaint();
216 private void setGraphText(GraphVertex o
, String text
){
217 int width
= 20 + this.getPanel().getDrawTextWidth(text
);
222 private void removeLastCharacterFromInput(){
223 this.typedStr
= this.typedStr
.substring(0,this.typedStr
.length()-1);
224 setGraphText(selectedObject
,typedStr
);
227 private void handleKey(int key
)
230 case KeyEvent
.VK_ENTER
:
233 case KeyEvent
.VK_BACK_SPACE
:
234 removeLastCharacterFromInput();
236 case KeyEvent
.VK_ESCAPE
:
237 doCancelNameChange();
245 public void keyPressed(KeyEvent arg0
) {
246 int key
= arg0
.getKeyCode();
247 if(this.isChangingName
&& selectedObject
!= null){
253 public void keyReleased(KeyEvent arg0
) {
257 private boolean acceptKeyForName(char a
){
258 String l
= new String();
260 String acceptKeys
= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$%^&*()_+=-`[]{};'\":<>?,./\\| «①∞⁵‰‽fl○";
261 return acceptKeys
.contains(l
);
265 public void keyTyped(KeyEvent arg0
) {
266 // Todo Fix VK_ENTER + VK_ESCAPE
267 if(this.isChangingName
&& selectedObject
!= null && !arg0
.isActionKey()){
268 if(arg0
.getKeyChar() != KeyEvent
.CHAR_UNDEFINED
&& acceptKeyForName(arg0
.getKeyChar())){
269 this.typedStr
+= arg0
.getKeyChar();
270 setGraphText(selectedObject
,typedStr
);